home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Text Processing / Alpha 5.63 / Tcl / SystemCode / c.tcl~ < prev    next >
Encoding:
Text File  |  1993-11-23  |  4.2 KB  |  187 lines  |  [TEXT/ALFA]

  1. #=============================================================================
  2. # "Electric" C functions.
  3. #=============================================================================
  4.  
  5. # First, define macros to bypass the electric braces.
  6. proc ordLeftBrace {} {
  7.     insertText "\{"
  8. }
  9. bind {'['} <cs> ordLeftBrace
  10.  
  11. proc ordRightBrace {} {
  12.     insertText "\}"
  13.     blink [matchIt "\}" [expr [getPos]-1]]
  14. }
  15. bind {']'} <cs> ordRightBrace
  16.     
  17. proc quoteWord {} {
  18.     backwardWord
  19.     insertText "'"
  20.     forwardWord
  21.     insertText "'"
  22. }
  23. bind ''' <z> quoteWord
  24.  
  25. # returns the indent string of the line named by 'pos'
  26. proc indentString pos {
  27.     set start [lineStart $pos]
  28.     set end [nextLineStart $pos]
  29.     set text [getText $start $end]
  30.     for {set i 0} {1} {incr i} {
  31.         set c [string index $text $i]
  32.         if {($c != "\ ") && ($c != "\t")} then {
  33.             return [string range $text 0 [expr $i-1]]
  34.         }
  35.     }
  36.     return
  37. }
  38.  
  39.  
  40. # Brace on new line, same indentation. Insert on another new line, indented in.
  41. # First, see if we are on new line.
  42. proc electricCLeft {} {
  43.     global elecLBrace
  44.     deleteText [getPos] [selEnd]
  45.     if {$elecLBrace == "0"} then {
  46.         insertText "\{"
  47.         return
  48.     }
  49.     set pos [getPos]
  50.     set start [lineStart $pos]
  51.     set text [getText $start $pos]
  52.     
  53.     for {set i $start} {$i < $pos} {incr i} {
  54.         set c [lookAt $i]
  55.         if {($c != "\ ") && ($c != "\t")} then {
  56.             set indentation [getText $start $i]
  57.             if {![catch {getText $i [expr $i+4]} var] && ($var == "else")} {
  58.                 replaceText [expr $start-1] $i " "
  59.                 goto [expr $pos-1]
  60.             }
  61.             insertText " \{\r" $indentation "\t"
  62.             return
  63.         }
  64.     }
  65.     set indentation [getText $start $pos]
  66.     insertText "\{\r" $indentation "\t"
  67. }
  68. bind '\{' <s> electricCLeft
  69.  
  70.  
  71. # Brace on new line, immediate carriage return
  72. proc electricCRight {} {
  73.     global elecRBrace
  74.     deleteText [getPos] [selEnd]
  75.     if {$elecRBrace == "0"} then {
  76.         insertText "\}"
  77.         catch {blink [matchIt "\}" [expr [getPos]-2]]}
  78.         return
  79.     }
  80.     set pos [getPos]
  81.     set start [lineStart $pos]
  82.     
  83.     if {[catch {matchIt "\}" [expr $pos-1]} matched]} {
  84.         beep
  85.         return
  86.     }
  87.     set text [getText [lineStart $matched] $matched]
  88.     regexp {^[     ]*} $text indentation
  89.     for {set i $start} {$i < $pos} {incr i} {
  90.         set c [lookAt $i]
  91.         if {($c != "\ ") && ($c != "\t")} then {
  92.             insertText "\r" $indentation "\}\r" $indentation
  93.             blink $matched
  94.             return
  95.         }
  96.     }
  97.     set text [set indentation]\}\r$indentation
  98.     replaceText $start $pos $text
  99.     goto [expr {$start + [string length $text]}]
  100.     blink [matchIt "\}" [expr $start-2]]
  101. }
  102. bind '\}' <s> electricCRight
  103.  
  104.  
  105. # Brace on new line, immediate carriage return. We don't do our electric stuff
  106. # if we are in the middle of a for statement.
  107. proc electricCSemi {} {
  108.     global electricSemi
  109.     deleteText [getPos] [selEnd]
  110.     if {$electricSemi == "0"} then {
  111.         insertText ";"
  112.         return
  113.     }
  114.     set pos [getPos]
  115.     set start [lineStart $pos]
  116.     set text [getText $start $pos]
  117.     
  118.     if {[string first "for" $text] != "-1"} {
  119.         set lefts 0
  120.         set rights 0
  121.         set len [string length $text]
  122.         for {set i 0} {$i < $len} {incr i} {
  123.             case [string index $text $i] in {
  124.                 "("    { incr lefts }
  125.                 ")"    { incr rights }
  126.             }
  127.         }
  128.         global globs
  129.         set globs [list $lefts $rights $len]
  130.         if {$lefts != $rights} {
  131.             insertText ";"
  132.             return
  133.         }
  134.     }
  135.     
  136.     insertText ";\r" [indentString $pos]
  137. }
  138. bind '\;' electricCSemi
  139.  
  140.  
  141. # 'C' programming mode 
  142. set thinkMenu "•300"
  143. set toolserverMenu "•265"
  144.  
  145. proc setCMode {} {
  146.     global toolserverMenu thinkMenu
  147.     changeMode "C"
  148.     uplevel #0 {
  149.         set prefixString "//"
  150.         set elecLBrace 1
  151.         set elecRBrace 1
  152.         set electricSemi 1
  153.         set wordWrap 0
  154.         set funcExpr {^[^ \t\(#\r/@].*\(.*\)$}
  155.         set sortedIsDefault 1
  156. #        set wordBreakPreface {[^a-zA-Z0-9]}
  157. #        set wordBreak {[a-zA-Z0-9]+}
  158.         set wordBreakPreface {[^a-zA-Z0-9_]}
  159.         set wordBreak {[a-zA-Z0-9_]+}
  160.     }
  161.     insertMenu    $thinkMenu
  162.     insertMenu    $toolserverMenu
  163. }
  164.  
  165. proc setC++Mode {} {
  166.     global wordBreakPreface wordBreak toolserverMenu thinkMenu
  167.     changeMode "C++"
  168.      uplevel #0 {
  169.         set prefixString "//"
  170.         set elecLBrace 1
  171.         set elecRBrace 1
  172.         set electricSemi 1
  173.         set wordWrap 0
  174.           set funcExpr {^([^ \t\(#\r/@].*[ \t]+)?([A-Za-z0-9:~_]+)[ \t\r]*\(.*\)?$}
  175.         set funcPar 2
  176.         set sortedIsDefault 1
  177.         set wordBreakPreface {[^a-zA-Z0-9_]}
  178.         set wordBreak {[a-zA-Z0-9_]+}
  179.     }
  180.     insertMenu    $thinkMenu
  181.     insertMenu    $toolserverMenu
  182. }
  183.  
  184.  
  185. source "$HOME:Tcl:SystemCode:think.tcl"
  186.  
  187.